/*
 * File name:  GlobalState.java
 * Copyright:  Copyright (c) 2006-2013 hoperun Inc,  All rights reserved
 * Description:  extends Android framework for define global state of this application.</br>It can be used by any context
 *              of this application</br>(need get/set method).  
 * Author:  Midnight
 * Last modified date:  2013-8-20
 * Version:  1.0
 * Edit history:  1.新建 -Midnight
 */
package com.hoperun.product.common;

import android.app.Application;
import android.text.TextUtils;

import com.hoperun.product.util.SharedPreferencesUtils;
import com.hoperun.product.util.ExceptionManager.CrashHandler;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.cache.CacheEntity;
import com.lzy.okgo.cache.CacheMode;
import com.lzy.okgo.cookie.store.PersistentCookieStore;
import com.lzy.okgo.model.HttpHeaders;

import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.logging.Level;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.SSLSession;
import javax.net.ssl.X509TrustManager;

/**
 * 该类用于存放phone ，pad 共用的静态变量，GlobalState为继承Application的类
 * 注意在存储时，将该变量一并存储到sharePreference中，以便在内容消耗殆尽时，可以从本地获取该数据
 * 
 * @Description<功能详细描述>
 * 
 * @author ren_qiujing
 * @Version [版本号, 2013-11-12]
 */
public class GlobalState extends Application {
	/**
	 * GlobalState 单例，给外部使用
	 */
	private static GlobalState instance = null;
	/**
	 * 存储sharepreferen的名称
	 */
	private final String share_name = "data";

	/**布票最大重量**/
	private String maxRequireWeight;



//	public void setmaxRequireWeight(String maxRequireWeight) {
//		this.maxRequireWeight = maxRequireWeight;
//		setValue("maxRequireWeight", maxRequireWeight);
//	}
//	public String getmaxRequireWeight() {
//		if (TextUtils.isEmpty(maxRequireWeight)) {
//			maxRequireWeight = (String) getVaule("maxRequireWeight", "");
//		}
//		return maxRequireWeight;
//	}

	
	
	
	
	
	
	
	
	
	
	
	
	
	
	
	/**
	 * 获取单例
	 * @LastModifiedDate：2013-10-18
	 * @author wang_ling
	 * @EditHistory：<修改内容><修改人>
	 */
	public static GlobalState getInstance() {
		if (null == instance) {
			instance = new GlobalState();
		}
		return instance;
	}

//	public void setValue(String key, Object value) {
//
//		SharedPreferencesUtils.setValueToSharePre(this, share_name, key,
//				value);
//	}
//
//	public Object getVaule(String key, Object defValue) {
//		return SharedPreferencesUtils.getValeFromSharePre(this, share_name,
//				key, defValue);
//	}

	@Override
	public void onCreate() {
		// TODO Auto-generated method stub
		super.onCreate();
		GlobalState.setApplication(this);

		CrashHandler crashHandler = CrashHandler.getInstance();
		crashHandler.init(getApplicationContext());

		intOKGO();


	}

	@Override
	public void onLowMemory() {
		// TODO Auto-generated method stub
		super.onLowMemory();
	}

	@Override
	public void onTerminate() {
		// TODO Auto-generated method stub
		super.onTerminate();
	}

	/**
	 * 
	 * 设置instance
	 * 
	 * @Description 设置instance
	 * 
	 * @param app
	 *            app
	 * @LastModifiedDate：2013-10-18
	 * @author wang_ling
	 * @EditHistory：<修改内容><修改人>
	 */
	public static void setApplication(Application app) {
		instance = (GlobalState) app;
	}


	public void intOKGO(){
		//必须调用初始化
		OkGo.init(this);
		//HttpHeaders headers = new HttpHeaders(); //header不支持中文，不允许有特殊字符
//        headers.put("commonHeaderKey1", "commonHeaderValue1");
//        HttpParams params = new HttpParams();
//        params.put("commonParamsKey2", "这里支持中文参数");
		//-----------------------------------------------------------------------------------//
		try {
			//以下都不是必须的，根据需要自行选择,一般来说只需要 debug,缓存相关,cookie相关的 就可以了
			OkGo.getInstance()

					// 打开该调试开关,打印级别INFO,并不是异常,是为了显眼,不需要就不要加入该行
					// 最后的true表示是否打印okgo的内部异常，一般打开方便调试错误
					.debug("OkGo", Level.INFO, true)

					//如果使用默认的 60秒,以下三行也不需要传
					.setConnectTimeout(15000)  //全局的连接超时时间
					.setReadTimeOut(15000)     //全局的读取超时时间
					.setWriteTimeOut(15000)    //全局的写入超时时间

					//可以全局统一设置缓存模式,默认是不使用缓存,可以不传,具体其他模式看 github 介绍 https://github.com/jeasonlzy/
					.setCacheMode(CacheMode.NO_CACHE)

					//可以全局统一设置缓存时间,默认永不过期,具体使用方法看 github 介绍
					.setCacheTime(CacheEntity.CACHE_NEVER_EXPIRE)

					//可以全局统一设置超时重连次数,默认为三次,那么最差的情况会请求4次(一次原始请求,三次重连请求),不需要可以设置为0
					.setRetryCount(0)

					//如果不想让框架管理cookie（或者叫session的保持）,以下不需要
//                .setCookieStore(new MemoryCookieStore())            //cookie使用内存缓存（app退出后，cookie消失）
					.setCookieStore(new PersistentCookieStore())        //cookie持久化存储，如果cookie不过期，则一直有效

					//可以设置https的证书,以下几种方案根据需要自己设置
					.setCertificates();
			//方法一：信任所有证书,不安全有风险
//                    .setCertificates(new SafeTrustManager())            //方法二：自定义信任规则，校验服务端证书
//                    .setCertificates(getAssets().open("srca.cer"))      //方法三：使用预埋证书，校验服务端证书（自签名证书）
//                    //方法四：使用bks证书和密码管理客户端证书（双向认证），使用预埋证书，校验服务端证书（自签名证书）
//                    .setCertificates(getAssets().open("xxx.bks"), "123456", getAssets().open("yyy.cer"))//

			//配置https的域名匹配规则，详细看demo的初始化介绍，不需要就不要加入，使用不当会导致https握手失败
//                    .setHostnameVerifier(new SafeHostnameVerifier())

			//可以添加全局拦截器，不需要就不要加入，错误写法直接导致任何回调不执行


//                    .addCommonHeaders(headers)  //设置全局公共头
//                    .addCommonParams(params);   //设置全局公共参数

		} catch (Exception e) {
			e.printStackTrace();
		}

	}


	/**
	 * 这里只是我谁便写的认证规则，具体每个业务是否需要验证，以及验证规则是什么，请与服务端或者leader确定
	 * 这里只是我谁便写的认证规则，具体每个业务是否需要验证，以及验证规则是什么，请与服务端或者leader确定
	 * 这里只是我谁便写的认证规则，具体每个业务是否需要验证，以及验证规则是什么，请与服务端或者leader确定
	 * 重要的事情说三遍，以下代码不要直接使用
	 */
	private class SafeTrustManager implements X509TrustManager {
		@Override
		public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
		}

		@Override
		public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
			try {
				for (X509Certificate certificate : chain) {
					certificate.checkValidity(); //检查证书是否过期，签名是否通过等
				}
			} catch (Exception e) {
				throw new CertificateException(e);
			}
		}

		@Override
		public X509Certificate[] getAcceptedIssuers() {
			return new X509Certificate[0];
		}
	}

	/**
	 * 这里只是我谁便写的认证规则，具体每个业务是否需要验证，以及验证规则是什么，请与服务端或者leader确定
	 * 这里只是我谁便写的认证规则，具体每个业务是否需要验证，以及验证规则是什么，请与服务端或者leader确定
	 * 这里只是我谁便写的认证规则，具体每个业务是否需要验证，以及验证规则是什么，请与服务端或者leader确定
	 * 重要的事情说三遍，以下代码不要直接使用
	 */
	private class SafeHostnameVerifier implements HostnameVerifier {
		@Override
		public boolean verify(String hostname, SSLSession session) {
			//验证主机名是否匹配
//            return hostname.equals("server.jeasonlzy.com");
			return true;
		}
	}

}
